package com.asiainfo.lop;

import android.content.Intent;
import android.os.Parcelable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;

import com.android.volley.VolleyError;
import com.asiainfo.lop.net.VolleyInterface;
import com.asiainfo.lop.net.VolleyRequest;
import com.asiainfo.lop.os.InitParam;
import com.asiainfo.lop.util.CryptionUtil;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.Poi;

import net.sf.json.JSONObject;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@EActivity(R.layout.main)
public class MainActivity extends BaseFragmentActivity implements View.OnClickListener {

    @ViewById(R.id.main_nav_crowd_image)
    ImageView mainNavCrowdImage;
    @ViewById(R.id.main_nav_area_image)
    ImageView mainNavAreaImage;
    @ViewById(R.id.main_nav_message_image)
    ImageView mainNavMessageImage;
    @ViewById(R.id.main_nav_workgroup_image)
    ImageView mainNavWorkGroupImage;
    @ViewById(R.id.main_nav_myself_image)
    ImageView mainNavMyselfImage;

    @ViewById(R.id.main_nav_crowd)
    LinearLayout mainNavCrowdTab;
    @ViewById(R.id.main_nav_area)
    LinearLayout mainNavAreaTab;
    @ViewById(R.id.main_nav_message)
    LinearLayout mainNavMessaeTab;
    @ViewById(R.id.main_nav_workgroup)
    LinearLayout mainNavWorkgroupTab;
    @ViewById(R.id.main_nav_myself)
    LinearLayout mainNavMyselfTab;

    Fragment fragmentCrowd;
    Fragment fragmentArea;
    Fragment fragmentMessage;
    Fragment fragmentWorkgroup;
    Fragment fragmentMyself;

    public LocationClient mLocationClient = null;
    public BDLocationListener myListener = new MyLocationListener();

    /**
     * 初始化事件
     */
    @AfterViews
    void initEvent() {
        mainNavCrowdTab.setOnClickListener(this);
        mainNavAreaTab.setOnClickListener(this);
        mainNavMessaeTab.setOnClickListener(this);
        mainNavWorkgroupTab.setOnClickListener(this);
        mainNavMyselfTab.setOnClickListener(this);

        // 默认加载人群
        navClick(R.id.main_nav_message + "");
    }

    @Override
    public void onClick(View v) {
        navClick(v.getId() + "");
    }

    /**
     * 导航点击
     */
    private void navClick(String navId) {
        // 重置导航栏
        resetNav();

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction transaction = fm.beginTransaction();
        //隐藏fragment
        hideFragment(transaction);
        Fragment curFragment = null;

        switch (navId) {
            case R.id.main_nav_crowd + "": {
                mainNavCrowdImage.setImageResource(R.drawable.nav_crowd_select);

                if (null == fragmentCrowd) {
                    fragmentCrowd = new MainFragmentCrowd_();
                    transaction.add(R.id.main_middle_framelayout, fragmentCrowd);
                }

                curFragment = fragmentCrowd;

                break;

            }
            case R.id.main_nav_area + "": {
                mainNavAreaImage.setImageResource(R.drawable.nav_area_select);

                if (null == fragmentArea) {
                    fragmentArea = new MainFragmentArea_();
                    transaction.add(R.id.main_middle_framelayout, fragmentArea);
                }

                curFragment = fragmentArea;

                break;
            }
            case R.id.main_nav_message + "": {
                mainNavMessaeTab.setBackgroundResource(R.drawable.nav_message_select);

                if (null == fragmentMessage) {
                    fragmentMessage = new MainFragmentMessage_();
                    transaction.add(R.id.main_middle_framelayout, fragmentMessage);
                }

                curFragment = fragmentMessage;

                break;
            }
            case R.id.main_nav_workgroup + "": {
                mainNavWorkGroupImage.setImageResource(R.drawable.nav_workgroup_select);

                if (null == fragmentWorkgroup) {
                    fragmentWorkgroup = new MainFragmentWorkgroup();
                    transaction.add(R.id.main_middle_framelayout, fragmentWorkgroup);
                }

                curFragment = fragmentWorkgroup;

                break;
            }
            case R.id.main_nav_myself + "": {
                mainNavMyselfImage.setImageResource(R.drawable.nav_myself_select);

                if (null == fragmentMyself) {
                    fragmentMyself = new MainFragmentMyself();
                    transaction.add(R.id.main_middle_framelayout, fragmentMyself);
                }

                curFragment = fragmentMyself;

                break;
            }
        }

        transaction.show(curFragment);
        transaction.commit();
    }

    /**
     * 隐藏fragment
     *
     * @param transaction
     */
    private void hideFragment(FragmentTransaction transaction) {
        if (null != fragmentCrowd) {
            transaction.hide(fragmentCrowd);
        }
        if (null != fragmentArea) {
            transaction.hide(fragmentArea);
        }
        if (null != fragmentMessage) {
            transaction.hide(fragmentMessage);
        }
        if (null != fragmentWorkgroup) {
            transaction.hide(fragmentWorkgroup);
        }
        if (null != fragmentMyself) {
            transaction.hide(fragmentMyself);
        }
    }

    /**
     * 重置导航栏
     */
    private void resetNav() {
        mainNavCrowdImage.setImageResource(R.drawable.nav_crowd);
        mainNavAreaImage.setImageResource(R.drawable.nav_area);
        mainNavMessaeTab.setBackgroundResource(R.drawable.nav_message);
        mainNavWorkGroupImage.setImageResource(R.drawable.nav_workgroup);
        mainNavMyselfImage.setImageResource(R.drawable.nav_myself);
    }

    public void createShortCut() {
        Toast.makeText(MainActivity.this, "asdfasfd", Toast.LENGTH_SHORT).show();
        Intent addShortCut;
        //判断是否需要添加快捷方式
        if (getIntent().getAction().equals(Intent.ACTION_CREATE_SHORTCUT)) {
            addShortCut = new Intent();
            //快捷方式的名称
            addShortCut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));
            //显示的图片
            Parcelable icon = Intent.ShortcutIconResource.fromContext(this, R.mipmap.logo);
            addShortCut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, icon);
            //快捷方式激活的activity，需要执行的intent，自己定义
            addShortCut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent());
            //OK，生成
            setResult(RESULT_OK, addShortCut);
        } else {
            //取消
            setResult(RESULT_CANCELED);
        }
    }

    @AfterViews
    void initGps() {
        mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类
        mLocationClient.registerLocationListener(myListener);    //注册监听函数
        initLocation();
        mLocationClient.start();
    }

    private void initLocation() {
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        option.setCoorType("bd09ll");//可选，默认gcj02，设置返回的定位结果坐标系
        option.setScanSpan(1000 * 60 * 1);//可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);//可选，设置是否需要地址信息，默认不需要
        option.setOpenGps(true);//可选，默认false,设置是否使用gps
        option.setLocationNotify(true);//可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setIsNeedLocationDescribe(true);//可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        option.setIsNeedLocationPoiList(true);//可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        option.setIgnoreKillProcess(false);//可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
        option.SetIgnoreCacheException(false);//可选，默认false，设置是否收集CRASH信息，默认收集
        option.setEnableSimulateGps(false);//可选，默认false，设置是否需要过滤gps仿真结果，默认需要
        mLocationClient.setLocOption(option);
    }

    public class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
            int errorCode = location.getLocType();
            if(161 == errorCode){
                double lat = location.getLatitude();
                double lng = location.getLongitude();
                locLatest("ADMIN", lng+"", lat+"", "");
            } else{
                Toast.makeText(MainActivity.this, "获取位置失败", Toast.LENGTH_LONG).show();
            }

            //Receive Location
            StringBuffer sb = new StringBuffer(256);
            sb.append("time : ");
            sb.append(location.getTime());
            sb.append("\nerror code : ");
            sb.append(location.getLocType());
            sb.append("\nlatitude : ");
            sb.append(location.getLatitude());
            sb.append("\nlontitude : ");
            sb.append(location.getLongitude());
            sb.append("\nradius : ");
            sb.append(location.getRadius());
            if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
                sb.append("\nspeed : ");
                sb.append(location.getSpeed());// 单位：公里每小时
                sb.append("\nsatellite : ");
                sb.append(location.getSatelliteNumber());
                sb.append("\nheight : ");
                sb.append(location.getAltitude());// 单位：米
                sb.append("\ndirection : ");
                sb.append(location.getDirection());// 单位度
                sb.append("\naddr : ");
                sb.append(location.getAddrStr());
                sb.append("\ndescribe : ");
                sb.append("gps定位成功");

            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
                sb.append("\naddr : ");
                sb.append(location.getAddrStr());
                //运营商信息
                sb.append("\noperationers : ");
                sb.append(location.getOperators());
                sb.append("\ndescribe : ");
                sb.append("网络定位成功");
            } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
                sb.append("\ndescribe : ");
                sb.append("离线定位成功，离线定位结果也是有效的");
            } else if (location.getLocType() == BDLocation.TypeServerError) {
                sb.append("\ndescribe : ");
                sb.append("服务端网络定位失败，可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com，会有人追查原因");
            } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
                sb.append("\ndescribe : ");
                sb.append("网络不同导致定位失败，请检查网络是否通畅");
            } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
                sb.append("\ndescribe : ");
                sb.append("无法获取有效定位依据导致定位失败，一般是由于手机的原因，处于飞行模式下一般会造成这种结果，可以试着重启手机");
            }
            sb.append("\nlocationdescribe : ");
            sb.append(location.getLocationDescribe());// 位置语义化信息
            List<Poi> list = location.getPoiList();// POI数据
            if (list != null) {
                sb.append("\npoilist size = : ");
                sb.append(list.size());
                for (Poi p : list) {
                    sb.append("\npoi= : ");
                    sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
                }
            }
//            Toast.makeText(MainActivity.this, sb.toString(), Toast.LENGTH_LONG).show();
        }
    }

    private void locLatest(String userId, String lng, String lat, String other) {
        String key = CryptionUtil.encryptWebParam("asdfasdf");
        userId = CryptionUtil.encryptWebParam(userId);
        lng = CryptionUtil.encryptWebParam(lng);
        lat = CryptionUtil.encryptWebParam(lat);
        other = CryptionUtil.encryptWebParam(other);

        String url = getString(R.string.rest_url_rooturl) + getString(R.string.rest_url_loc_latest);
        url = url.replace("{key}", key);
        url = url.replace("{userId}", userId);
        url = url.replace("{lng}", lng);
        url = url.replace("{lat}", lat);
        url = url.replace("{other}", other);

        Map m = new HashMap();
        m.put("key", key);
        m.put("userId", userId);
        m.put("lng", lng);
        m.put("lat", lat);
        m.put("other", other);

        VolleyInterface volleyInterface = new VolleyInterface(this) {
            @Override
            public void success(JSONObject result) {

            }

            @Override
            public void error(VolleyError volleyError) {
                Log.e(InitParam.TAG, volleyError.getMessage());
            }
        };
        VolleyRequest.post(this, url, "MainActivity", m, volleyInterface);
    }
}


